package org.convallaria.framework.security.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/**
 * Security配置属性
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@ConfigurationProperties(prefix = "convallaria.security")
public class SecurityProperties {

    /**
     * 是否启用Security模块
     */
    private boolean enabled = true;

    /**
     * JWT配置
     */
    private Jwt jwt = new Jwt();

    /**
     * 白名单配置（不需要认证的URL）
     */
    private List<String> whiteList = new ArrayList<>();

    /**
     * 跨域配置
     */
    private Cors cors = new Cors();

    /**
     * 审计日志配置
     */
    private Audit audit = new Audit();

    /**
     * JWT配置类
     */
    @Data
    public static class Jwt {
        /**
         * JWT密钥（建议使用环境变量配置）
         */
        private String secret = "convallaria-security-secret-key-please-change-in-production";

        /**
         * Token有效期（分钟）
         */
        private int expireMinutes = 120;

        /**
         * Token刷新时间（分钟）- 在此时间内可以刷新token
         */
        private int refreshMinutes = 240;

        /**
         * Token请求头名称
         */
        private String header = "Authorization";

        /**
         * Token前缀
         */
        private String prefix = "Bearer ";

        /**
         * 是否支持多终端登录
         */
        private boolean multiLogin = false;

        /**
         * 最大在线设备数（仅在不支持多终端登录时生效）
         */
        private int maxDevices = 1;
    }

    /**
     * 跨域配置类
     */
    @Data
    public static class Cors {
        /**
         * 是否启用跨域
         */
        private boolean enabled = true;

        /**
         * 允许的源
         */
        private List<String> allowedOrigins = List.of("*");

        /**
         * 允许的方法
         */
        private List<String> allowedMethods = List.of("GET", "POST", "PUT", "DELETE", "OPTIONS");

        /**
         * 允许的头
         */
        private List<String> allowedHeaders = List.of("*");

        /**
         * 暴露的头
         */
        private List<String> exposedHeaders = List.of("Authorization");

        /**
         * 是否允许携带凭证
         */
        private boolean allowCredentials = true;

        /**
         * 预检请求缓存时间（秒）
         */
        private long maxAge = 3600;
    }

    /**
     * 审计日志配置
     */
    @Data
    public static class Audit {
        /**
         * 是否启用审计日志
         */
        private boolean enabled = true;

        /**
         * 是否记录请求参数
         */
        private boolean logRequestParams = true;

        /**
         * 是否记录响应结果
         */
        private boolean logResponseData = false;

        /**
         * 忽略的URL列表
         */
        private List<String> ignoreUrls = new ArrayList<>();

        /**
         * 敏感字段列表（日志脱敏）
         */
        private List<String> sensitiveFields = List.of("password", "token", "secret");
    }
}
